package connect5.ia;

/*
 * Si vous utilisez Java, vous devez modifier ce fichier-ci.
 *
 * Vous pouvez ajouter d'autres classes sous le package connect5.ia.
 * 
 *
 * Prénom Nom    (00 000 000)
 * Prénom Nom    (00 000 000)
 */

import java.util.Random;
import java.util.Vector;

import connect5.Grille;
import connect5.Joueur;

/**
 * 
 * @author Vos noms et matricules
 */
public class JoueurArtificiel implements Joueur {

   private static final int BLACK_MOVE = 1;

   private static final int WHITE_MOVE = 2;

   private static final int BLANK_SPACE = 0;

   private Random random = new Random();

   private GridAnalyser analyser = new GridAnalyser();

   @Override
   public int[] getProchainCoup(Grille g, int delais) {

      Grille gridCopy = g.clone();

      int nbcol = g.getData()[0].length;
      Vector<Integer> vides = extractEmptySpaces(g, nbcol);

      Integer position_to_play = new Integer(-1);

      if (isBlackPlaying(g.getSize(), vides.size())) {

         long max_value = -2000000000;

         for (Integer one_integer : vides) {

            long actual_value = evaluateBlackPositionValue(gridCopy, nbcol, one_integer);

            if (actual_value > max_value) {
               max_value = actual_value;
               position_to_play = one_integer;
            }
            resetPositionToEmpty(gridCopy, nbcol, one_integer);
         }
      } else {
         long min_value = 2000000000;

         for (Integer one_integer : vides) {

            long actual_value = evaluateWhitePositionValue(gridCopy, nbcol, one_integer);

            if (actual_value < min_value) {
               min_value = actual_value;
               position_to_play = one_integer;
            }
            resetPositionToEmpty(gridCopy, nbcol, one_integer);
         }
      }

      // int choix = random.nextInt(vides.size());
      // choix = vides.get(choix);
      return new int[] { position_to_play / nbcol, position_to_play % nbcol };
   }

   private Vector<Integer> extractEmptySpaces(Grille g, int nbcol) {

      Vector<Integer> vides = new Vector<Integer>();

      for (int l = 0; l < g.getData().length; l++)
         for (int c = 0; c < nbcol; c++)
            if (g.getData()[l][c] == 0)
               vides.add(l * nbcol + c);

      return vides;
   }

   private void resetPositionToEmpty(Grille gridCopy, int nbcol, Integer one_integer) {
      gridCopy.set(one_integer / nbcol, one_integer % nbcol, BLANK_SPACE);
   }

   private long evaluateWhitePositionValue(Grille gridCopy, int nbcol, Integer one_integer) {
      gridCopy.set(one_integer / nbcol, one_integer % nbcol, WHITE_MOVE);
      return analyser.analyseGrid(gridCopy);
   }

   private long evaluateBlackPositionValue(Grille gridCopy, int nbcol, Integer one_integer) {
      gridCopy.set(one_integer / nbcol, one_integer % nbcol, BLACK_MOVE);
      return analyser.analyseGrid(gridCopy);
   }

   private boolean isBlackPlaying(int grid_size, int vide_size) {
      return ((grid_size - vide_size) % 2 == 0);
   }

   private void Utility() {

   }

}
